Datina 1: Grammar of Graphics

Published

August 11, 2024

¿Qué es?

ggplot2

Para fines prácticos de esta sesión trabajaremos con el paquete de R ggplot2.

También existe una alternativa en python para grammar of graphics llamada plotnine la cual está basada en ggplot2.

¿Qué NO es está Datina?

¿Qué SÍ es está Datina?

  • Vista rápida en el porqué la gramática de gráficos es útil es la mayoría de DataSets

  • Un espacio para que florezcan dudas e inquitudes sobre la visualización de datos.

Base de Datos

Se usará el DataSet de Suicide Rates Overview 1985 to 2016 el cuál compara información socioeconómica con tasas de suicidio por año y país para explicar cómo funciona the grammar of Graphics.

Code
data <- read.csv("media/master.csv")
head(data)

Comparación de enfoques Forma Tradicional vs Grammar of Graphics

Forma Tradicional

Code
plot(data$population, data$suicides_no)

Plotear con ggplot / plotnine

Code
library(ggplot2)

ggplot(data, aes(x = population, y = suicides_no)) +
  geom_point()

Agregar color dependiendo del sexo

Introducción a wide and long data

  • Wide format data tiene valores que no se repiten en la primera columna.

  • Long format data tiene valores que se repiten en la primera columna.

Forma Tradicional (Wide Format)

Se crean nuevas columnas para la población y número de suicidios de hombres y de mujeres.

Code
library(dplyr)
library(tidyr)
library(knitr)

df_wide <- data %>%
  select(country, year, age, sex, suicides_no, population) %>%
  pivot_wider(
    values_from = c("population", "suicides_no"),
    names_from = "sex",
    id_cols = c("country", "year", "age")
  )

head(df_wide)

Code
plot(df_wide$population_male, df_wide$suicides_no_male, col = "red")
points(df_wide$population_female, df_wide$suicides_no_female, col = "blue")

Grammar of Graphics

Grammar of graphics usa Long Format, por lo que no es necesario crear nuevas columnas.

Code
ggplot(data, aes(x = population, y = suicides_no, colour = sex))+
  geom_point()

Aesthetics and Geoms

aes(x = population, y = suicides_no, colour = sex)

  • La estética del gráfico se asocia con valores para cada uno de nuestros de la siguiente manera:

    • El eje horizontal con la columna de population
    • El eje vertical con la columna de suicides_no
    • El color de los puntos con la columna de sex
  • geoms controlan como la estética se visualiza.

Color por país

Code
library(dplyr)

set.seed(1)
random_countries <- sample(unique(data$country), 5)

filtered_data <- data %>%
  filter(country %in% random_countries)

age_order <- c("5-14 years", "15-24 years", "25-34 years", 
               "35-54 years", "55-74 years", "75+ years")

filtered_data <- filtered_data %>%
  mutate(age = factor(age, levels = age_order))
Code
ggplot(filtered_data, aes(x = population, y = suicides_no, colour = country)) +
  geom_point()

Shape por país

Code
ggplot(filtered_data, aes(x = population, y = suicides_no, shape = country)) +
  geom_point()

Regresión (Lineal) por país

Code
ggplot(filtered_data, aes(x = population, y = suicides_no, colour = country)) +
  geom_point(alpha = 0.3) + geom_smooth(method = "lm", se = F)

Regresión de todos (5) los países

Code
ggplot(filtered_data, aes(x = population, y = suicides_no)) +
  geom_point(alpha = 0.3, aes(colour = country)) +
  geom_smooth(method = "lm", se = F, colour = "black")

¿Qué es un geom?

  • geom_point y geom_smooth son ambos elementos geométricos (“geoms”) usados para representar datos.
  • Aquí ambos usan las mismas variables x y y para producir una diferente vosualización.
  • Otros ejemplos son geom_line, geom_histagram, geom_violin, geom_rectangle.
Code
dummy_df <- data.frame(
  x = c(1, 2, 3),
  y = c(2, 4, 10),
  label = c("a", "b", "c")
)

head(dummy_df)

Puntos

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_point()

Texto

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_text(size = 18)

Columnas

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_col()

Linea

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_line()

Linea y puntos

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_line() + geom_point()

Polígono

Code
ggplot(dummy_df, aes(x,y, label = label)) + 
  theme(text = element_text(size=14)) + 
  geom_polygon()

Orden de Capas

El orden de los geoms importa. En este caso al ser geom_smooth el último geom, se plotea adelante del gráfico.

Code
ggplot(filtered_data, aes(x = population, y = suicides_no)) +
  geom_point(alpha = 0.3, aes(colour = country)) +
  geom_smooth(method = "lm", se = F, colour = "black")

Aquí en cambio la línea de regresión se muestra debajo de los puntos.

Code
ggplot(filtered_data, aes(x = population, y = suicides_no)) +
  geom_smooth(method = "lm", se = F, colour = "black") +
  geom_point(alpha = 0.3, aes(colour = country)) 

Cambiar las escalas de los ejes

Es muy fácil cambiar las escalas de los ejes, aquí por ejemplo se muestra un cambio en escala de raíz cuadrada.

Code
ggplot(filtered_data, aes(x = population, y = suicides_no)) +
  geom_point(alpha = 0.3, aes(colour = country)) +
  scale_x_sqrt() + scale_y_sqrt()

Volviendo a nuestro DataSet

¿Cuáles ha sido las tendencias de suicidios a lo largo del tiempo?

Esta visualización no termina de ser muy informativa.

Code
ggplot(filtered_data, aes(x = year, y = suicides_no)) + 
  geom_point(alpha = 0.3)

Boxplots

Code
ggplot(filtered_data, aes(x = as.factor(year), y = suicides_no)) + 
  geom_boxplot()

Voltear Boxplots

Sigue sin ser una buena visualización, porque no explica la tendencia a nivel país.

Code
ggplot(filtered_data, aes(x = as.factor(year), y = suicides_no)) + 
  geom_boxplot() + 
  coord_flip()

Tendencias por país

Obtenemos una visualización ruidosa.

Code
ggplot(filtered_data, aes(x = as.factor(year), y = suicides_no, fill = country)) + 
  geom_boxplot() + 
  coord_flip()

Separar por grupos de edades

Code
ggplot(filtered_data, aes(x = year, y = suicides_no, colour = country, shape = age)) + 
  geom_point(alpha = 0.8) 

Facet Panelling

  • Crear subgráficos (facets)

  • Cada facet representa un gráfico de un subconjunto de tu data.

Facet por país

Code
ggplot(filtered_data, aes(x = year, y = suicides_no, shape = age)) + 
  geom_point() +  facet_wrap(~country) 

Paneles de Edad y País

Code
ggplot(filtered_data, aes(x = year, y = suicides_no)) + 
  geom_point() +  facet_grid(vars(country), vars(age), scales = "free") 

Agregar color en sexo

Code
ggplot(filtered_data, aes(x = year, y = suicides_no, colour = sex)) + 
  geom_point() +  facet_grid(vars(country), vars(age), scales = "free") 

Cambiar puntos a lineas

Code
ggplot(filtered_data, aes(x = year, y = suicides_no, colour = sex)) + 
  geom_line() +  facet_grid(vars(country), vars(age), scales = "free") 

Beneficios de GG

  • Exploración de datos rápida.

  • Permite tener un orden de capas entre variables.

  • Existen muchísimos gráficos.

Referencias de Consulta